import Vue from 'vue'
import {
	login,
	getLoginUser,
	logout
} from '@/api/modular/system/loginManage'
import {
	sysDictTypeTree
} from '@/api/modular/system/dictManage'
import {
	sysMenuChange
} from '@/api/modular/system/menuManage'
import {list as orgList} from '@/api/modular/main/emsorg/emsOrgManage'
import {setOrgList} from '@/utils/util'

import {
	ACCESS_TOKEN,
	ALL_APPS_MENU,
	DICT_TYPE_TREE_DATA
} from '@/store/mutation-types'

import {
	welcome
} from '@/utils/util'
import store from '../index'
import router from '../../router'

const user = {
	state: {
		token: '',
		name: '',
		welcome: '',
		avatar: '',
		buttons: [], // 按钮权限
		admintype: '', // 是否是超管
		roles: [],
		info: {}
	},

	mutations: {
		SET_TOKEN: (state, token) => {
			state.token = token
		},
		SET_NAME: (state, {
			name,
			welcome
		}) => {
			state.name = name
			state.welcome = welcome
		},
		SET_AVATAR: (state, avatar) => {
			state.avatar = avatar
		},
		SET_ROLES: (state, roles) => {
			state.roles = roles
		},
		SET_INFO: (state, info) => {
			state.info = info
		},
		SET_BUTTONS: (state, buttons) => {
			state.buttons = buttons
		},
		SET_ADMINTYPE: (state, admintype) => {
			state.admintype = admintype
		}
	},

	actions: {
		// 登录
		Login({
			commit
		}, userInfo) {
			console.log("process.env.NODE_ENV",process.env.NODE_ENV);
			
			return new Promise((resolve, reject) => {
				login(userInfo).then(response => {
					if (!response.success) {
						reject(response.message)
						return
					}
					const result = response.data
					Vue.ls.set(ACCESS_TOKEN, result, 7 * 24 * 60 * 60 * 1000)
					commit('SET_TOKEN', result)
					resolve()
					// eslint-disable-next-line handle-callback-err
				}).catch(error => {
					// eslint-disable-next-line prefer-promise-reject-errors
					reject('后端未启动或代理错误')
				})
			})
		},

		// 获取用户信息
		GetInfo({
			commit
		}) {
      orgList().then((res) => {
        setOrgList(res.data)
      })
			return new Promise((resolve, reject) => {
				getLoginUser().then(response => {
					if (response.success) {
						const data = response.data
						commit('SET_ADMINTYPE', data.adminType)
						commit('SET_ROLES', 1)
						commit('SET_BUTTONS', data.permissions)
						commit('SET_INFO', data)
						Vue.ls.set('SET_INFO', data)
						commit('SET_NAME', {
							name: data.name,
							welcome: welcome()
						})
						if (data.avatar != null) {
							commit('SET_AVATAR', process.env.VUE_APP_API_BASE_URL +
								'/sysFileInfo/preview?id=' + data.avatar)
						}
						resolve(data)
					} else {
						// eslint-disable-next-line no-undef
						reject(new Error(data.message))
					}
				}).catch(error => {
					reject(error)
				})
			})
		},

		// 登出
		Logout({
			commit,
			state
		}) {
			return new Promise((resolve) => {
				logout(state.token).then(() => {
					resolve()
				}).catch(() => {
					resolve()
				}).finally(() => {
					commit('SET_TOKEN', '')
					commit('SET_ROLES', [])
					commit('SET_BUTTONS', [])
					commit('SET_ADMINTYPE', '')
					Vue.ls.remove(ACCESS_TOKEN)
					Vue.ls.remove(ALL_APPS_MENU)
					Vue.ls.remove(DICT_TYPE_TREE_DATA)
				})
			})
		},

		// 加载所有字典数据
		dictTypeData() {
			return new Promise((resolve, reject) => {
				sysDictTypeTree().then((data) => {
					if (data.success) {
						const result = data.data
						Vue.ls.set(DICT_TYPE_TREE_DATA, result)
						resolve()
					} else {
						// eslint-disable-next-line no-undef
						reject(new Error(data.message))
					}
				}).catch(error => {
					reject(error)
				})
			})
		},

		// 切换应用菜单
		MenuChange({
			commit
		}, application) {
			return new Promise((resolve) => {
				sysMenuChange({
					application: application.code
				}).then((res) => {
					const apps = {
						'code': '',
						'name': '',
						'active': '',
						'menu': ''
					}
					apps.active = true
					apps.menu = res.data
					// eslint-disable-next-line camelcase
					const all_app_menu = Vue.ls.get(ALL_APPS_MENU)
					// eslint-disable-next-line camelcase
					const new_false_all_app_menu = []
					// 先去除所有默认的，以为此时切换的即将成为前端缓存默认的应用
					all_app_menu.forEach(item => {
						if (item.active) {
							item.active = false
						}
						new_false_all_app_menu.push(item)
					})
					// 此时缓存中全部都是不默认的应用
					Vue.ls.set(ALL_APPS_MENU, new_false_all_app_menu)
					apps.name = application.name
					apps.code = application.code
					const applocationR = []
					applocationR.push(apps)
					Vue.ls.set(ALL_APPS_MENU, applocationR)
					resolve(res)
					const antDesignmenus = res.data
					store.dispatch('GenerateRoutes', {
						antDesignmenus
					}).then(() => {
						router.addRoutes(store.getters.addRouters)
					})
					// 切换应用刷新整体界面，暂且取消
					// window.location.reload()
				}).catch(() => {
					resolve()
				})
			})
		}

	}
}

export default user
